package com.tgu.home_action.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tgu.home_action.pojo.Admin;
import com.tgu.home_action.pojo.Case;
import com.tgu.home_action.pojo.Place;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

import java.sql.Timestamp;
import java.util.List;

@Repository
public interface CaseMapper extends BaseMapper<Case> {
    /**
     * 通过老人ID查询案件
     */
    @Select("select * from cases where old_man_id=#{oldManId} and state=1")
    List<Case> getByOldManId(Integer oldManId);

    /**
     * 插入新案件
     */
    void insertCase(Case newCase);

    /**
     * 查询所有案件
     */
    List<Case> getCases(Case caseInformation);

    /**
     * 查询案件数量
     */
    @Select("select count(*) from cases where state=1")
    int getCaseNumber();

    /**
     * 查询正在进行的案件
     *
     * @param time     ：据开始时间
     * @param distance ：时差
     * @param gis      ：志愿者位置
     */
    List<Case> getIngCase(@Param("startTime") Timestamp time, @Param("distance") Integer distance, @Param("gis") String gis);

    /**
     * 通过Id查询案件
     */
    @Select("select * from cases where id=#{id}")
    Case getById(Integer id);

    /**
     * 查询志愿者参与的所有案件
     */
    List<Case> getVolunteerCases(Integer volunteerId);

    /**
     * 查询志愿者正在参与的案件
     */
    List<Case> getVolunteerIngCases(Integer volunteerId);

    /**
     * 志愿者本人查询正在参与的案件
     */
    List<Case> getMyIngCases(Integer volunteerId);

    /**
     * 查询正在进行但未参与的案件
     */
    List<Case> getNewCases(Integer volunteerId);

    /**
     * 根据老人Id获取正在进行的案件
     */
    @Select("select * from cases where old_man_id=#{oldManId} and state=1")
    Case getIngCaseByOldManId(Integer oldManId);

    /**
     * 修改案件
     */
    Boolean updateCase(Case nowCase);

    /**
     * 修改案件状态
     *
     * @return
     */
    @Update("update cases set state=#{state} where id=#{caseId}")
    Boolean changeCaseState(Integer caseId, int state);

    /**
     * 获取证件照
     */
    String getIdentificationById(Integer caseId);

    /**
     * 通过caseId获取家属联系电话
     */
    String getPhoneByCaseId(Integer caseId);

    /**
     * 修改案件状态
     */
    @Update("update cases set state=#{state} where id=#{id} and family_id=#{familyId}")
    Boolean updateStateByIdAndFamilyId(Case nowCase);

    /**
     * 通过人脸识别ID查询案件
     */
    Case getCaseByFaceId(Integer faceId);

    /**
     * 通过家属ID查询案件
     */
    List<Case> getByFamilyId(Integer familyId);

    /**
     * 通过家属ID查询正在进行的案件
     */
    List<Case> getIngByFamilyId(Integer id);

    /**
     * 查询志愿者参与的案件数量
     */
    Integer getVolunteerTotalCaseNum(Integer volunteerId);

    /**
     * 查询志愿者参与的已完成的案件数量
     */
    Integer getVolunteerFinishCaseNum(Integer volunteerId);

    /**
     * 获得符合条件的志愿者参与的案件数量
     */
    int getVolunteerAccordNumber(Case nowCase);

    /**
     * 获得符合条件的志愿者参与的案件
     */
    List<Case> getVolunteerAccordCase(Case nowCase);

    /**
     * 获得符合条件的家属相关的案件数量
     */
    int getFamilyAccordNumber(Case nowCase);

    /**
     * 获得符合条件的家属相关的案件
     */
    List<Case> getFamilyAccordCase(Case nowCase);

    /**
     * 获得符合条件的老人相关的案件数量
     */
    int getOldManAccordNumber(Case nowCase);

    /**
     * 获得符合条件的老人相关的案件
     */
    List<Case> getOldManAccordCase(Case nowCase);

    /**
     * 查询符合条件的案件数量
     */
    int getAccordCaseNumber(Case nowCase);

    /**
     * 查询符合条件的案件
     */
    List<Case> getAccordCase(Case nowCase);

    /**
     * 取消与老人的绑定
     */
    @Update("update cases set old_man_id=null where old_man_id=#{oldManId}")
    void updateOldManId(Integer oldManId);

    /**
     * 获取随机的案件
     */
    List<Case> getRandCases(Integer count);

    /**
     * 取消与家属/老人的绑定
     */
    @Update("update cases set family_id=null,old_man_id=null where family_id=#{familyId}")
    void updateFamilyId(Integer id);

    /**
     * 通过老人ID查询案件
     */
    @Select("select * from cases where old_man_id=#{oldManId}")
    List<Case> getAllCaseByOldManId(Integer oldManId);

    /**
     * 查询完成的案件数量
     */
    Integer getFinishCaseNumber(Admin admin);

    /**
     * 查询某地区的案件数量
     */
    Integer getCaseNumberByPlace(Admin admin);

    /**
     * 查询某地区的案件平均完成时间n
     */
    Double getAvgFinishCaseTime(Admin admin);

    /**
     * 设置结束时间
     */
    @Update("update cases set end_time = #{endTime} where id=#{id}")
    void setEndTime(Case nowCase);

    /**
     * 查询今日新增案件数
     */
    int getTodayNewCaseNum(Place place);

    /**
     * 查询今日完成案件数
     */
    int getTodayFinishCaseNum( Place place);

    /**
     * 获取案件发生top5
     */
    List<Place> getTopCasePlace(Timestamp time);

    /**
     * 查询每小时的案件数
     */
    List<Place> getHourCaseNum(Place place);

    /**
     * 24小时内正在发生的案件
     */
    List<Case> getIngCaseToday(Place place);

    List<Case> getCaseByLikeId(String id);
}
